package com.doitedu.core

import com.doitedu.utils.SparkUtil

/**
 * @Date: 22.6.29 
 * @Author: HANGGE
 * @qq: 598196583
 * @Tips: 学大数据 ,到多易教育
 * @Description:
 * 算子  RDD上的方法  类似于scala集合中的方法
 *
 * 算子内的函数是分布式运行的  运行在远程端 不是在本地
 *     main分发的程序的入口  main  JVM进程    Driver
 *     用于编写程序   划分分区  划分数据  划分阶段  创建Task   提交程序
 *
 */
object C09_Transformations_Operator_Map {
  def main(args: Array[String]): Unit = {
    val sc = SparkUtil
      .getSparkContext("map算子")
    /**
     * 加载本地数据  创建RDD
     *    RDD是分布式弹性数据集
     *    1 RDD 分区并行计算
     *      注意:由文件创建RDD 分区数的计算逻辑和本地集合不一致 ,
     *         和MR的任务切片的计算逻辑一样
     *         加载数据转换的RDD的分区数至少为 2
     */
    val rdd1 = sc.textFile("data/")
    println(rdd1.getNumPartitions)
    // 查看每个分区的数据
    rdd1.mapPartitionsWithIndex((p,lines)=>{
      lines.map(line=>line+"---分区是: "+p)
    }).foreach(println)
    var i = 0
    // 将函数分发到对应分区所在的机器  处理对应分区内的数据任务
    // 函数并不是在本地执行的
     val f  = (x:String)=>{
      i+=1
      // 类似于在另一个JVM中创建一个i变量
       x.toUpperCase()
     }

    // 转换算子处理数据
    val rdd2 = rdd1.map(f)  // ---远程端  分布式执行

    // 0  i在本地没有变化
    println(i)


    //输出  行动算子  Actions
    rdd2.foreach(println)
    sc.stop()

  }

}
